package com.hdy.proxy;

import com.hdy.service.Service;
import com.hdy.service.impl.JayChou;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {
    Service target;
    //传入目标对象
    public ProxyFactory(Service target){
        this.target=target;
    }

    public Object getAgent(){
        /*
        返回动态代理对象,
        程序运行时创建，
        可调用目标对象方法，
        并执行自己的代理功能
        */
        return Proxy.newProxyInstance(
                //传入目标对象的类加载器
                target.getClass().getClassLoader(),
                //传入类实现的接口数组,Class<?>[]，interfaces
                target.getClass().getInterfaces(),
                //匿名内部实现代理对象功能接口
                new InvocationHandler() {
                    //代理对象对目标对象的所有方法调用都会转发给InvocationHandler.invoke()方法
                    @Override
                    public Object invoke(
                            //创建代理对象
                            Object proxy,
                            //目标对象方法
                            Method method,
                            //目标方法的参数
                            Object[] objects) throws Throwable {
                        //实现代理功能
                        System.out.println("预定时间....");
                        System.out.println("预定场地...");
                        //实现目标对象功能
                        /*
                        * 代理对象通过反射机制执行目标对象的方法，
                        * 返回值是...
                        * 反正有一个返回值先不管
                        */
                        Object invoke = method.invoke(target, objects);
                        //实现代理功能
                        System.out.println("结算费用...");
                        return invoke;//目标方法的返回值
                    }
                }
        );
    }
}
